package log

import (
	"fmt"
	"log"
)

var (
	mp_log *Log_Class
)

func This() *Log_Class {
	if mp_log == nil {
		mp_log = &Log_Class{}
	}
	return mp_log
}

type LogProcFunc func(content string)

type Log_Class struct {
	ErrorFunc   LogProcFunc
	DebugFunc   LogProcFunc
	LogInfoFunc LogProcFunc
}

func (c *Log_Class) RegistError(handle LogProcFunc) {
	c.ErrorFunc = handle
}

func (c *Log_Class) RegistDebug(handle LogProcFunc) {
	c.DebugFunc = handle
}

func (c *Log_Class) RegistInfo(handle LogProcFunc) {
	c.LogInfoFunc = handle
}

// Debug 日志输出和官方fmt.Print、fmt.Printf使用一致
func (c *Log_Class) Debug(a ...interface{}) {
	if a[0] != nil {
		if c.DebugFunc != nil {
			c.DebugFunc(fmt.Sprint(a...))
			return
		}
		log.Println(a...)
	}
}

// DebugF 日志输出和官方fmt.Print、fmt.Printf使用一致
func (c *Log_Class) DebugF(format string, a ...interface{}) {
	if len(a) > 0 && a[0] != nil {
		if c.DebugFunc != nil {
			c.DebugFunc(fmt.Sprintf(format, a...))
			return
		}
		log.Printf(format, a...)
		return
	}
	c.Debug(format)
}

// LogInfo 日志输出和官方fmt.Print、fmt.Printf使用一致
func (c *Log_Class) Info(a ...interface{}) {
	if a[0] != nil {
		if c.LogInfoFunc != nil {
			c.LogInfoFunc(fmt.Sprint(a...))
			return
		}
		log.Println(a...)
	}
}

// LogInfoF 日志输出和官方fmt.Print、fmt.Printf使用一致
func (c *Log_Class) InfoF(format string, a ...interface{}) {
	if len(a) > 0 && a[0] != nil {
		if c.LogInfoFunc != nil {
			c.LogInfoFunc(fmt.Sprintf(format, a...))
			return
		}
		log.Printf(format, a...)
		return
	}
	c.Info(format)
}

// Error 日志输出和官方fmt.Print、fmt.Printf使用一致
func (c *Log_Class) Error(a ...interface{}) {
	if a[0] != nil {
		if c.ErrorFunc != nil {
			c.ErrorFunc(fmt.Sprint(a...))
			return
		}
		log.Println(a...)
	}
}

// ErrorF 日志输出和官方fmt.Print、fmt.Printf使用一致
func (c *Log_Class) ErrorF(format string, a ...interface{}) {
	if len(a) > 0 && a[0] != nil {
		if c.ErrorFunc != nil {
			c.ErrorFunc(fmt.Sprintf(format, a...))
			return
		}
		log.Printf(format, a...)
		return
	}
	c.Error(format)
}
